# load required libraries
library(tidyverse)
── Attaching packages ──────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.0.0     ✔ purrr   0.2.5
✔ tibble  1.4.2     ✔ dplyr   0.7.6
✔ tidyr   0.8.1     ✔ stringr 1.3.1
✔ readr   1.1.1     ✔ forcats 0.3.0
── Conflicts ─────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(langcog) # source: https://github.com/langcog/langcog-package

Attaching package: ‘langcog’

The following object is masked from ‘package:base’:

    scale
library(psych)

Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha
library(lme4)
Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:tidyr’:

    expand
library(cowplot)

Attaching package: ‘cowplot’

The following object is masked from ‘package:ggplot2’:

    ggsave
# set theme for ggplots
theme_set(theme_bw())

Data preparation

d_all <- # d_us_ad_pilot %>% rownames_to_column("subid") %>%
  d_gh_ad %>% rownames_to_column("subid") %>%
  full_join(d_gh_ch %>% rownames_to_column("subid")) %>%
  full_join(d_th_ad %>% rownames_to_column("subid")) %>%
  full_join(d_th_ch %>% rownames_to_column("subid")) %>%
  full_join(d_vt_ad %>% rownames_to_column("subid")) %>%
  full_join(d_vt_ch %>% rownames_to_column("subid")) %>%
  column_to_rownames("subid")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")
Joining, by = c("subid", "choose what to do", "feel guilty", "feel happy", "feel love", "feel pain", "feel proud", "feel sad", "feel scared", "feel shy", "feel sick, like when you feel like you might vomit", "feel tired", "figure out how to do things", "get angry", "get hungry", "get hurt feelings", "hear things", "pray", "remember things", "sense temperatures", "sense when things are far away", "smell things", "think about things")

Shared conceptual structure

Pooling all participants from all sites together into a common factor structure.

Parallel analysis

How many factors to retain?

reten_all_PA <- fa.parallel(d_all, plot = F); reten_all_PA
Parallel analysis suggests that the number of factors =  4  and the number of components =  2 
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  2 

 Eigen Values of 
  Original factors Simulated data Original components simulated data
1             8.94           0.35                9.52           1.27
2             1.46           0.25                2.08           1.23
3             0.50           0.21                1.11           1.20
4             0.25           0.18                0.86           1.17
reten_all_par <- reten_all_PA$nfact

What are these factors?

efa_all_par <- fa(d_all, nfactors = reten_all_par, rotate = "oblimin",
                  scores = "tenBerge", impute = "median")
Loading required namespace: GPArotation
heatmap_fun(efa_all_par) + 
  labs(title = "Parallel Analysis")
Joining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_par, target = "all") + 
  labs(title = "Parallel Analysis")

|======================================                 | 70% ~1 s remaining     
|========================================               | 73% ~1 s remaining     
|=========================================              | 76% ~1 s remaining     
|===========================================            | 78% ~1 s remaining     
|============================================           | 82% ~0 s remaining     
|==============================================         | 85% ~0 s remaining     
|================================================       | 89% ~0 s remaining     
|==================================================     | 92% ~0 s remaining     
|====================================================   | 95% ~0 s remaining     
|====================================================== | 99% ~0 s remaining     
Ignoring unknown aesthetics: y

scoresplot_fun(efa_all_par, target = c("ghosts", "God", "children")) + 
  labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_par, target = c("ghosts", "God", "children")) +
  labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"

|=============================                          | 53% ~2 s remaining     
|==============================                         | 55% ~2 s remaining     
|===============================                        | 57% ~2 s remaining     
|================================                       | 59% ~2 s remaining     
|=================================                      | 60% ~1 s remaining     
|==================================                     | 62% ~1 s remaining     
|==================================                     | 63% ~1 s remaining     
|====================================                   | 66% ~1 s remaining     
|=====================================                  | 67% ~1 s remaining     
|=====================================                  | 69% ~1 s remaining     
|=======================================                | 71% ~1 s remaining     
|=======================================                | 72% ~1 s remaining     
|========================================               | 74% ~1 s remaining     
|=========================================              | 76% ~1 s remaining     
|==========================================             | 77% ~1 s remaining     
|===========================================            | 79% ~1 s remaining     
|===========================================            | 80% ~1 s remaining     
|============================================           | 81% ~1 s remaining     
|=============================================          | 83% ~1 s remaining     
|==============================================         | 85% ~1 s remaining     
|===============================================        | 87% ~0 s remaining     
|================================================       | 89% ~0 s remaining     
|=================================================      | 91% ~0 s remaining     
|===================================================    | 93% ~0 s remaining     
|====================================================   | 95% ~0 s remaining     
|=====================================================  | 97% ~0 s remaining     
|====================================================== | 99% ~0 s remaining     
Joining, by = c("factor", "capacity", "order")

Minimizing BIC

How many factors to retain?

reten_all_BIC <- VSS(d_all, plot = F); reten_all_BIC

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.89  with  1  factors
VSS complexity 2 achieves a maximimum of 0.93  with  2  factors

The Velicer MAP achieves a minimum of 0.01  with  2  factors 
BIC achieves a minimum of  -613.26  with  4  factors
Sample Size adjusted BIC achieves a minimum of  -157.21  with  5  factors

Statistics by number of factors 
  vss1 vss2   map dof chisq    prob sqresid  fit RMSEA  BIC SABIC complex eChisq
1 0.89 0.00 0.022 209  2284 0.0e+00    10.9 0.89 0.104  855  1519     1.0   2775
2 0.57 0.93 0.010 188   874 7.3e-89     6.7 0.93 0.063 -412   185     1.5    580
3 0.45 0.82 0.011 168   550 4.5e-42     5.7 0.94 0.050 -599   -66     1.9    281
4 0.45 0.82 0.014 149   406 1.2e-25     5.2 0.95 0.043 -613  -140     2.0    178
5 0.42 0.74 0.018 131   323 3.4e-18     4.9 0.95 0.040 -573  -157     2.2    138
6 0.44 0.72 0.022 114   260 1.8e-13     4.6 0.95 0.038 -519  -157     2.3    103
7 0.41 0.71 0.028  98   212 2.2e-10     4.3 0.96 0.036 -458  -147     2.4     79
8 0.41 0.69 0.033  83   159 1.1e-06     4.1 0.96 0.032 -409  -145     2.5     56
   SRMR eCRMS eBIC
1 0.080 0.084 1346
2 0.037 0.041 -706
3 0.026 0.030 -868
4 0.020 0.025 -841
5 0.018 0.024 -758
6 0.015 0.022 -677
7 0.014 0.021 -591
8 0.011 0.019 -512
reten_all_bic <- data.frame(reten_all_BIC$vss.stats %>% rownames_to_column("nfact") %>% top_n(-1, BIC))$nfact %>% as.numeric()

What are these factors?

efa_all_bic <- fa(d_all, nfactors = reten_all_bic, rotate = "oblimin",
                  scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_bic, 
            factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL", "other")) + 
  # labs(title = "Minimizing BIC")
  labs(x = "Figure 1: Shared conceptual structure") +
  theme(axis.title.x = element_text(hjust = 0)) +
  guides(fill = guide_colorbar("factor loading", barheight = 15))
the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_bic, target = "all", highlight = "supernatural",
            factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL", "other")) + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1,
                                   color = c(rep("black", 8),
                                             rep("#984ea3", 2)),
                                   face = c(rep("plain", 8),
                                            rep("bold", 2)))) +
  scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8", "gray")) +
  # labs(title = "Minimizing BIC")
  labs(title = "Figure 2: Factor scores")
the condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which
will replace the existing scale.

scoresplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) + 
  # scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) +
  labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) + 
  labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"

|=============================================          | 83% ~0 s remaining     
|==============================================         | 85% ~0 s remaining     
|===============================================        | 86% ~0 s remaining     
|================================================       | 89% ~0 s remaining     
|=================================================      | 91% ~0 s remaining     
|==================================================     | 93% ~0 s remaining     
|====================================================   | 95% ~0 s remaining     
|=====================================================  | 97% ~0 s remaining     
|====================================================== | 99% ~0 s remaining     
Joining, by = c("factor", "capacity", "order")

Preset criteria

How many factors to retain?

reten_all_k <- reten_fun(d_all, rot_type = "oblimin"); reten_all_k
[1] 2

What are these factors?

efa_all_k <- fa(d_all, nfactors = reten_all_k, rotate = "oblimin",
                  scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_k) + 
  labs(title = "Preset criteria (Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_k, target = "all") + 
  labs(title = "Preset criteria (Weisman et al., 2017)")
Ignoring unknown aesthetics: y

scoresplot_fun(efa_all_k, target = c("ghosts", "God", "children")) + 
  labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_k, target = c("ghosts", "God", "children")) + 
  labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"

|==========================================             | 78% ~1 s remaining     
|===========================================            | 80% ~1 s remaining     
|============================================           | 81% ~0 s remaining     
|=============================================          | 83% ~0 s remaining     
|=============================================          | 84% ~0 s remaining     
|==============================================         | 85% ~0 s remaining     
|===============================================        | 87% ~0 s remaining     
|================================================       | 89% ~0 s remaining     
|=================================================      | 90% ~0 s remaining     
|==================================================     | 92% ~0 s remaining     
|===================================================    | 94% ~0 s remaining     
|====================================================   | 95% ~0 s remaining     
|=====================================================  | 97% ~0 s remaining     
|====================================================== | 99% ~0 s remaining     
Joining, by = c("factor", "capacity", "order")

3 factors

What are these factors?

efa_all_3 <- fa(d_all, nfactors = 3, rotate = "oblimin",
                scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_3, 
            factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL")) + 
  labs(x = "Shared concpetual structure") +
  theme(axis.title.x = element_text(hjust = 0))
the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"

  # labs(title = "Preset criteria (Weisman et al., 2017)")

Which capacities are attributed to which targets?

scoresplot_fun(efa_all_3, target = "all", highlight = "supernatural",
               factor_names = c("COGNITIVE", "BODILY", "SOCIAL-EMOTIONAL")) +
  scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1,
                                   color = c(rep("black", 8),
                                             rep("#984ea3", 2)),
                                   face = c(rep("plain", 8),
                                            rep("bold", 2))))
the condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which
will replace the existing scale.

scoresplot_fun(efa_all_3, target = c("ghosts", "God", "children")) + 
  labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_3, target = c("ghosts", "God", "children")) + 
  labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"

|========================================               | 74% ~1 s remaining     
|=========================================              | 76% ~1 s remaining     
|===========================================            | 78% ~1 s remaining     
|============================================           | 80% ~1 s remaining     
|=============================================          | 82% ~0 s remaining     
|==============================================         | 84% ~0 s remaining     
|===============================================        | 86% ~0 s remaining     
|================================================       | 88% ~0 s remaining     
|=================================================      | 90% ~0 s remaining     
|==================================================     | 92% ~0 s remaining     
|===================================================    | 94% ~0 s remaining     
|====================================================   | 96% ~0 s remaining     
|====================================================== | 98% ~0 s remaining     
Joining, by = c("factor", "capacity", "order")

Comparing conceptual structures

We’ll extract 4 factors from all samples, to keep things simple.

efa_us_ad_4 <- fa(d_us_ad_pilot, nfactors = 4, rotate = "oblimin")
efa_gh_ad_4 <- fa(d_gh_ad, nfactors = 4, rotate = "oblimin")
efa_gh_ch_4 <- fa(d_gh_ch, nfactors = 4, rotate = "oblimin")
efa_th_ad_4 <- fa(d_th_ad, nfactors = 4, rotate = "oblimin")
efa_th_ch_4 <- fa(d_th_ch, nfactors = 4, rotate = "oblimin")
efa_vt_ad_4 <- fa(d_vt_ad, nfactors = 4, rotate = "oblimin")
efa_vt_ch_4 <- fa(d_vt_ch, nfactors = 4, rotate = "oblimin")
plot_us_ad_4 <- heatmap_fun(efa_us_ad_4) + 
  guides(fill = "none") + 
  labs(x = "US: adults") +
  theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_gh_ad_4 <- heatmap_fun(efa_gh_ad_4) + 
  guides(fill = "none") + 
  labs(x = "Ghana: adults") +
  theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_gh_ch_4 <- heatmap_fun(efa_gh_ch_4) + 
  guides(fill = "none") + 
  labs(x = "Ghana: children") +
  theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_th_ad_4 <- heatmap_fun(efa_th_ad_4) + 
  guides(fill = "none") + 
  labs(x = "Thailand: adults") +
  theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_th_ch_4 <- heatmap_fun(efa_th_ch_4) + 
  guides(fill = "none") + 
  labs(x = "Thailand: children") +
  theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_vt_ad_4 <- heatmap_fun(efa_vt_ad_4) + 
  guides(fill = "none") + 
  labs(x = "Vanuatu: adults") +
  theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_vt_ch_4 <- heatmap_fun(efa_vt_ch_4) + 
  guides(fill = "none") + 
  labs(x = "Vanuatu: children") +
  theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_grid(#plot_us_ad_4, 
          plot_gh_ad_4, plot_gh_ch_4, plot_th_ad_4, 
          plot_th_ch_4, plot_vt_ad_4, plot_vt_ch_4, 
          ncol = 2, labels = c("A", "B", "C", "D", "E", "F", "G"))

Counts

paste("US adults:", nrow(d_us_ad_pilot))
[1] "US adults: 131"
paste("GH adults:", nrow(d_gh_ad))
[1] "GH adults: 150"
paste("GH children:", nrow(d_gh_ch))
[1] "GH children: 149"
paste("TH adults:", nrow(d_th_ad))
[1] "TH adults: 150"
paste("TH children:", nrow(d_th_ch))
[1] "TH children: 152"
paste("VT adults:", nrow(d_vt_ad))
[1] "VT adults: 164"
paste("VT children:", nrow(d_vt_ch))
[1] "VT children: 169"
paste("Non-US:", sum(nrow(d_gh_ad), nrow(d_gh_ch),
                     nrow(d_th_ad), nrow(d_th_ch),
                     nrow(d_vt_ad), nrow(d_vt_ch)))
[1] "Non-US: 934"
LS0tCnRpdGxlOiAiU1JDRCAyMDE5IFN5bXBvc2l1bTogUmVsaWdpb3VzICYgbWV0YXBoeXNpY2FsIGNvbmNlcHRzIChTcmluaXZhc2FuKSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42NykKYGBgCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKbGlicmFyeShjb3dwbG90KQoKIyBzZXQgdGhlbWUgZm9yIGdncGxvdHMKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpzb3VyY2UoIi4vc2NyaXB0cy9tYXhfZmFjdG9yc19lZmEuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Bsb3RfZnVuX2JlZXRsZXMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3JldGVuX2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvY2xlYW5fZnVuLlIiKQpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbgoKYGBge3IsIGluY2x1ZGUgPSBGfQpxdWVzdGlvbl9rZXkgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREVWRUxPUE1FTlRBTCBUQVNLUy9iZWV0bGVzOmRpbWtpZDpmYWN0b3JzL2Rlc2lnbi9iZWV0bGVzIGNiLmNzdiIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGLCB3YXJuaW5nID0gRkFMU0V9CiMgVVMgYWR1bHRzIFBJTE9UCmRfdXNfYWRfcGlsb3RfcmF3IDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RFVkVMT1BNRU5UQUwgVEFTS1MvYmVldGxlczpkaW1raWQ6ZmFjdG9ycy9hbmFseXNpcy9fVVMgcGlsb3QvYmVldGxlc19waWxvdDJfdGlkeS5jc3YiKQpkX3VzX2FkX3BpbG90IDwtIGRfdXNfYWRfcGlsb3RfcmF3ICU+JQogIGZpbHRlcihzY2FsZSA9PSAiYmVldGxlcyIpICU+JQogIGRpc3RpbmN0KHN1YmlkLCBjaGFyYWN0ZXIsIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgZmlsdGVyKCFxdWVzdGlvbiAlaW4lIGMoImJsZWVkIiwgIm1pbmQiLCAic291bCIpKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSByZWNvZGUocXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRfc3VidHJhY3QiID0gImFkZCBhbmQgc3VidHJhY3QgbnVtYmVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmdyeSIgPSAiZ2V0IGFuZ3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiYmxlZWQiID0gImJsZWVkIHdoZW4gdGhleSB0b3VjaCBzb21ldGhpbmcgc2hhcnAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvb3NlIiA9ICJjaG9vc2Ugd2hhdCB0byBkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWd1cmVfb3V0IiA9ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpbHR5IiA9ICJmZWVsIGd1aWx0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXBweSIgPSAiZmVlbCBoYXBweSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFyIiA9ICJoZWFyIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJodW5ncnkiID0gImdldCBodW5ncnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaHVydF9mZWVsaW5ncyIgPSAiZ2V0IGh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibG92ZSIgPSAiZmVlbCBsb3ZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAibWluZCIgPSAiaGF2ZSBtaW5kcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWluIiA9ICJmZWVsIHBhaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJheSIgPSAicHJheSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdWQiID0gImZlZWwgcHJvdWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtZW1iZXIiID0gInJlbWVtYmVyIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWQiID0gImZlZWwgc2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjYXJlZCIgPSAiZmVlbCBzY2FyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc2VfZmFyIiA9ICJzZW5zZSB3aGVuIHRoaW5ncyBhcmUgZmFyIGF3YXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc2VfdGVtcCIgPSAic2Vuc2UgdGVtcGVyYXR1cmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoeSIgPSAiZmVlbCBzaHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2ljayIgPSAiZmVlbCBzaWNrLCBsaWtlIHdoZW4geW91IGZlZWwgbGlrZSB5b3UgbWlnaHQgdm9taXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic21lbGwiID0gInNtZWxsIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInNvdWwiID0gImhhdmUgc291bHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpbmsiID0gInRoaW5rIGFib3V0IHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXJlZCIgPSAiZmVlbCB0aXJlZCIpKSAlPiUKICBzcHJlYWQocXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBzZWxlY3QoLXN1YmlkKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBwYXN0ZSgidXNfYWQiLAogICAgICAgICAgICAgICAgICAgICAgIDEwMDAxOigxMDAwMCtsZW5ndGgobGV2ZWxzKGZhY3RvcihkX3VzX2FkX3BpbG90X3JhdyRzdWJpZCkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJfIikpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKSAlPiUKICBzZWxlY3QoLWBhZGQgYW5kIHN1YnRyYWN0IG51bWJlcnNgLCAtY2hhcmFjdGVyKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgd2FybmluZyA9IEZBTFNFfQojIyBVUyBhZHVsdHM6IE5PVCBZRVQgUlVOCiMjIFVTIGNoaWxkcmVuOiBOT1QgWUVUIFJVTgoKIyMgR0ggYWR1bHRzOiBOT1QgWUVUIFJVTgpkX2doX2FkIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfR0hBTkFfMjAxOC9iZWV0bGVzX2doYW5hX2FkdWx0c190aWR5XzIwMTgtMDgtMTIuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAiZ2giLCBhZ2UgPSAiYWQiKQojIyBHSCBjaGlsZHJlbgpkX2doX2NoIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfR0hBTkEvYmVldGxlc19naGFuYV90aWR5XzIwMTctMDctMTIuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAiZ2giLCBhZ2UgPSAiY2giKQpkX2doX2NoX2ZhbnRlIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfR0hBTkFfMjAxOC9iZWV0bGVzX2doYW5hX2ZhbnRlX2NoaWxkcmVuX3RpZHlfMjAxOC0wNy0xOS5jc3YiKVstMV0gJT4lIAogIHJlbmFtZShzdWJudW0gPSBzdWJpZCkgJT4lIAogIGZpbHRlcihncmVwbCgiZmFudGUiLCB0b2xvd2VyKGxhbmd1YWdlX2hvbWUpKSB8IGdyZXBsKCJ0d2kiLCB0b2xvd2VyKGxhbmd1YWdlX2hvbWUpKSkgJT4lCiAgY2xlYW5fZnVuKGtleSA9IHF1ZXN0aW9uX2tleSwgZXhfYWRkc3ViID0gVCwgc2l0ZSA9ICJnaCIsIGFnZSA9ICJjaCIpCgojIyBDSCBhZHVsdHM6IE5PVCBZRVQgUlVOCiMjIENIIGNoaWxkcmVuOiBOT1QgWUVUIFJVTgoKIyMgVEggYWR1bHRzCmRfdGhfYWQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9EZXNrdG9wL1RFTVAvVEVNUF9USEFJTEFORC9iZWV0bGVzX3RoYWlsYW5kX2FkdWx0c190aWR5XzIwMTgtMDUtMDkuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAidGgiLCBhZ2UgPSAiYWQiKQojIyBUSCBjaGlsZHJlbgpkX3RoX2NoIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfVEhBSUxBTkQvYmVldGxlc190aGFpbGFuZF9jaGlsZHJlbl90aWR5XzIwMTgtMDUtMDkuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAidGgiLCBhZ2UgPSAiY2giKQoKIyMgVlQgYWR1bHRzCmRfdnRfYWQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9EZXNrdG9wL1RFTVAvVEVNUF9WQU5VQVRVL2JlZXRsZXNfdmFudWF0dV9hZHVsdHNfdGlkeV8yMDE4LTA1LTA5LmNzdiIpICU+JSBjbGVhbl9mdW4oa2V5ID0gcXVlc3Rpb25fa2V5LCBleF9hZGRzdWIgPSBULCBzaXRlID0gInZ0IiwgYWdlID0gImFkIikKIyMgVlQgY2hpbGRyZW4KZF92dF9jaCA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0Rlc2t0b3AvVEVNUC9URU1QX1ZBTlVBVFUvYmVldGxlc192YW51YXR1X2NoaWxkcmVuX3RpZHlfMjAxOC0wNS0wOS5jc3YiKSAlPiUgY2xlYW5fZnVuKGtleSA9IHF1ZXN0aW9uX2tleSwgZXhfYWRkc3ViID0gVCwgc2l0ZSA9ICJ2dCIsIGFnZSA9ICJjaCIpCmBgYAoKYGBge3J9CmRfYWxsIDwtICMgZF91c19hZF9waWxvdCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIGRfZ2hfYWQgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBmdWxsX2pvaW4oZF9naF9jaCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF90aF9hZCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF90aF9jaCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF92dF9hZCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBmdWxsX2pvaW4oZF92dF9jaCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKYGBgCgojIFNoYXJlZCBjb25jZXB0dWFsIHN0cnVjdHVyZQoKUG9vbGluZyBhbGwgcGFydGljaXBhbnRzIGZyb20gYWxsIHNpdGVzIHRvZ2V0aGVyIGludG8gYSBjb21tb24gZmFjdG9yIHN0cnVjdHVyZS4KCiMjIFBhcmFsbGVsIGFuYWx5c2lzCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fYWxsX1BBIDwtIGZhLnBhcmFsbGVsKGRfYWxsLCBwbG90ID0gRik7IHJldGVuX2FsbF9QQQpyZXRlbl9hbGxfcGFyIDwtIHJldGVuX2FsbF9QQSRuZmFjdApgYGAKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV9hbGxfcGFyIDwtIGZhKGRfYWxsLCBuZmFjdG9ycyA9IHJldGVuX2FsbF9wYXIsIHJvdGF0ZSA9ICJvYmxpbWluIiwKICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAyfQpoZWF0bWFwX2Z1bihlZmFfYWxsX3BhcikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuNX0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9wYXIsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKyAKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9Cml0ZW1zcGxvdF9mdW4oZWZhX2FsbF9wYXIsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKwogIGxhYnModGl0bGUgPSAiUGFyYWxsZWwgQW5hbHlzaXMiKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9CSUMgPC0gVlNTKGRfYWxsLCBwbG90ID0gRik7IHJldGVuX2FsbF9CSUMKcmV0ZW5fYWxsX2JpYyA8LSBkYXRhLmZyYW1lKHJldGVuX2FsbF9CSUMkdnNzLnN0YXRzICU+JSByb3duYW1lc190b19jb2x1bW4oIm5mYWN0IikgJT4lIHRvcF9uKC0xLCBCSUMpKSRuZmFjdCAlPiUgYXMubnVtZXJpYygpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9iaWMgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX2JpYywgcm90YXRlID0gIm9ibGltaW4iLAogICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNC41fQpoZWF0bWFwX2Z1bihlZmFfYWxsX2JpYywgCiAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkNPR05JVElWRSIsICJCT0RJTFkiLCAiU09DSUFMLUVNT1RJT05BTCIsICJvdGhlciIpKSArIAogICMgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCiAgbGFicyh4ID0gIkZpZ3VyZSAxOiBTaGFyZWQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKCJmYWN0b3IgbG9hZGluZyIsIGJhcmhlaWdodCA9IDE1KSkKYGBgCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gImFsbCIsIGhpZ2hsaWdodCA9ICJzdXBlcm5hdHVyYWwiLAogICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJDT0dOSVRJVkUiLCAiQk9ESUxZIiwgIlNPQ0lBTC1FTU9USU9OQUwiLCAib3RoZXIiKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGMocmVwKCJibGFjayIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIiM5ODRlYTMiLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGMocmVwKCJwbGFpbiIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYm9sZCIsIDIpKSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZTQxYTFjIiwgIiM0ZGFmNGEiLCAiIzM3N2ViOCIsICJncmF5IikpICsKICAjIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQogIGxhYnModGl0bGUgPSAiRmlndXJlIDI6IEZhY3RvciBzY29yZXMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAxfQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2U0MWExYyIsICIjNGRhZjRhIiwgIiMzNzdlYjgiKSkgKwogIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KaXRlbXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiTWluaW1pemluZyBCSUMiKQpgYGAKCgoKIyMgUHJlc2V0IGNyaXRlcmlhCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fYWxsX2sgPC0gcmV0ZW5fZnVuKGRfYWxsLCByb3RfdHlwZSA9ICJvYmxpbWluIik7IHJldGVuX2FsbF9rCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9rIDwtIGZhKGRfYWxsLCBuZmFjdG9ycyA9IHJldGVuX2FsbF9rLCByb3RhdGUgPSAib2JsaW1pbiIsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMn0KaGVhdG1hcF9mdW4oZWZhX2FsbF9rKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9rLCB0YXJnZXQgPSAiYWxsIikgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuNX0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9rLCB0YXJnZXQgPSBjKCJnaG9zdHMiLCAiR29kIiwgImNoaWxkcmVuIikpICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgY3JpdGVyaWEgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfaywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCgojIyAzIGZhY3RvcnMKCiMjIyBXaGF0IGFyZSB0aGVzZSBmYWN0b3JzPwoKYGBge3J9CmVmYV9hbGxfMyA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSAzLCByb3RhdGUgPSAib2JsaW1pbiIsCiAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNn0KaGVhdG1hcF9mdW4oZWZhX2FsbF8zLCAKICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gYygiQ09HTklUSVZFIiwgIkJPRElMWSIsICJTT0NJQUwtRU1PVElPTkFMIikpICsgCiAgbGFicyh4ID0gIlNoYXJlZCBjb25jcGV0dWFsIHN0cnVjdHVyZSIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKICAjIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNjd9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfMywgdGFyZ2V0ID0gImFsbCIsIGhpZ2hsaWdodCA9ICJzdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJDT0dOSVRJVkUiLCAiQk9ESUxZIiwgIlNPQ0lBTC1FTU9USU9OQUwiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNlNDFhMWMiLCAiIzRkYWY0YSIsICIjMzc3ZWI4IikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGMocmVwKCJibGFjayIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIiM5ODRlYTMiLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGMocmVwKCJwbGFpbiIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYm9sZCIsIDIpKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxLjV9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfMywgdGFyZ2V0ID0gYygiZ2hvc3RzIiwgIkdvZCIsICJjaGlsZHJlbiIpKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KaXRlbXNwbG90X2Z1bihlZmFfYWxsXzMsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgoKIyBDb21wYXJpbmcgY29uY2VwdHVhbCBzdHJ1Y3R1cmVzCgpXZSdsbCBleHRyYWN0IDQgZmFjdG9ycyBmcm9tIGFsbCBzYW1wbGVzLCB0byBrZWVwIHRoaW5ncyBzaW1wbGUuCgpgYGB7cn0KZWZhX3VzX2FkXzQgPC0gZmEoZF91c19hZF9waWxvdCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmVmYV9naF9hZF80IDwtIGZhKGRfZ2hfYWQsIG5mYWN0b3JzID0gNCwgcm90YXRlID0gIm9ibGltaW4iKQplZmFfZ2hfY2hfNCA8LSBmYShkX2doX2NoLCBuZmFjdG9ycyA9IDQsIHJvdGF0ZSA9ICJvYmxpbWluIikKZWZhX3RoX2FkXzQgPC0gZmEoZF90aF9hZCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmVmYV90aF9jaF80IDwtIGZhKGRfdGhfY2gsIG5mYWN0b3JzID0gNCwgcm90YXRlID0gIm9ibGltaW4iKQplZmFfdnRfYWRfNCA8LSBmYShkX3Z0X2FkLCBuZmFjdG9ycyA9IDQsIHJvdGF0ZSA9ICJvYmxpbWluIikKZWZhX3Z0X2NoXzQgPC0gZmEoZF92dF9jaCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmBgYAoKYGBge3J9CnBsb3RfdXNfYWRfNCA8LSBoZWF0bWFwX2Z1bihlZmFfdXNfYWRfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiVVM6IGFkdWx0cyIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKCnBsb3RfZ2hfYWRfNCA8LSBoZWF0bWFwX2Z1bihlZmFfZ2hfYWRfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiR2hhbmE6IGFkdWx0cyIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKCnBsb3RfZ2hfY2hfNCA8LSBoZWF0bWFwX2Z1bihlZmFfZ2hfY2hfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiR2hhbmE6IGNoaWxkcmVuIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApKQoKcGxvdF90aF9hZF80IDwtIGhlYXRtYXBfZnVuKGVmYV90aF9hZF80KSArIAogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIAogIGxhYnMoeCA9ICJUaGFpbGFuZDogYWR1bHRzIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApKQoKcGxvdF90aF9jaF80IDwtIGhlYXRtYXBfZnVuKGVmYV90aF9jaF80KSArIAogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIAogIGxhYnMoeCA9ICJUaGFpbGFuZDogY2hpbGRyZW4iKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpCgpwbG90X3Z0X2FkXzQgPC0gaGVhdG1hcF9mdW4oZWZhX3Z0X2FkXzQpICsgCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsgCiAgbGFicyh4ID0gIlZhbnVhdHU6IGFkdWx0cyIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKCnBsb3RfdnRfY2hfNCA8LSBoZWF0bWFwX2Z1bihlZmFfdnRfY2hfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiVmFudWF0dTogY2hpbGRyZW4iKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpCmBgYAoKYGBge3IsIGZpZy5hc3AgPSAxLjV9CnBsb3RfZ3JpZCgjcGxvdF91c19hZF80LCAKICAgICAgICAgIHBsb3RfZ2hfYWRfNCwgcGxvdF9naF9jaF80LCBwbG90X3RoX2FkXzQsIAogICAgICAgICAgcGxvdF90aF9jaF80LCBwbG90X3Z0X2FkXzQsIHBsb3RfdnRfY2hfNCwgCiAgICAgICAgICBuY29sID0gMiwgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIpKQpgYGAKCiMgQ291bnRzCgpgYGB7cn0KcGFzdGUoIlVTIGFkdWx0czoiLCBucm93KGRfdXNfYWRfcGlsb3QpKQpwYXN0ZSgiR0ggYWR1bHRzOiIsIG5yb3coZF9naF9hZCkpCnBhc3RlKCJHSCBjaGlsZHJlbjoiLCBucm93KGRfZ2hfY2gpKQpwYXN0ZSgiVEggYWR1bHRzOiIsIG5yb3coZF90aF9hZCkpCnBhc3RlKCJUSCBjaGlsZHJlbjoiLCBucm93KGRfdGhfY2gpKQpwYXN0ZSgiVlQgYWR1bHRzOiIsIG5yb3coZF92dF9hZCkpCnBhc3RlKCJWVCBjaGlsZHJlbjoiLCBucm93KGRfdnRfY2gpKQoKcGFzdGUoIk5vbi1VUzoiLCBzdW0obnJvdyhkX2doX2FkKSwgbnJvdyhkX2doX2NoKSwKICAgICAgICAgICAgICAgICAgICAgbnJvdyhkX3RoX2FkKSwgbnJvdyhkX3RoX2NoKSwKICAgICAgICAgICAgICAgICAgICAgbnJvdyhkX3Z0X2FkKSwgbnJvdyhkX3Z0X2NoKSkpCmBgYAoK